package com.ld.admin.util;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.jsoup.nodes.Element;

import com.ld.admin.model.system.SysMenuModel;
import com.ld.admin.util.permission.PermissionChecker;
import com.ld.admin.util.permission.impl.SysUserPermChecker;
import com.ld.common.util.SharedVarsUtil;
import com.ld.shieldsb.common.core.util.StringUtils;

/**
 * 权限工具类，对一些常用操作进行了聚合
 * 
 * @ClassName PermissionUtil
 * @author <a href="mailto:donggongai@126.com" target="_blank">吕凯</a>
 * @date 2019年6月19日 下午4:26:03
 *
 */
public class PermissionUtil {
    private static final PermissionChecker CHECKER = new SysUserPermChecker();

    /**
     * 是否检查权限，顶级管理员用户不检查
     * 
     * @Title checkPermission
     * @author 吕凯
     * @date 2019年6月19日 下午4:05:15
     * @param request
     * @return boolean
     */
    public static boolean checkPermission(HttpServletRequest request) {
        return CHECKER.checkPermission(request); // 非顶级管理员，顶级管理员不判断权限
    }

    /**
     * 获取url在权限中的映射url
     * 
     * @Title getUrlPerm
     * @author 吕凯
     * @date 2019年6月11日 下午1:55:28
     * @param url
     * @return String
     */
    public static String getUrlPerm(String url) {
        return CHECKER.getUrlPerm(url);
    }

    /**
     * 获取url对应的权限model
     * 
     * @Title getPermModleByUrl
     * @author 吕凯
     * @date 2019年6月11日 下午2:03:21
     * @param url
     * @return SysMenuModel
     */
    public static SysMenuModel getPermModleByUrl(String url) {
        return CHECKER.getPermModleByUrl(url);
    }

    /**
     * 根据pageId获取权限model
     * 
     * @Title getPermByPageId
     * @author 吕凯
     * @date 2019年6月19日 下午4:24:55
     * @param pageId
     * @return SysMenuModel
     */
    public static SysMenuModel getPermByPageId(String pageId) {
        return CHECKER.getPermByPageId(pageId);
    }

    public static Set<String> getUserPermSubjects(HttpServletRequest request) {
        return CHECKER.getUserPermSubjects(request);
    }

    public static boolean checkUrlPerm(HttpServletRequest request, String dataUrl) {
        if (StringUtils.isNotBlank(dataUrl)) {
            dataUrl = SharedVarsUtil.delInnerVars(dataUrl, null);
        }
        return checkPerm(request, null, dataUrl);
    }

    public static boolean checkPageIdPerm(HttpServletRequest request, String pageId) {
        return checkPerm(request, pageId, null);
    }

    /**
     * 检查pageId或dataUrl权限是否存在
     * 
     * @Title checkPerm
     * @author 吕凯
     * @date 2019年9月21日 上午9:04:53
     * @param request
     * @param userPermUrls
     * @param pageId
     * @param dataUrl
     * @return boolean
     */
    public static boolean checkPerm(HttpServletRequest request, String pageId, String dataUrl) {
        return CHECKER.checkPerm(request, pageId, dataUrl);
    }

    /**
     * 通过url检查权限
     * 
     * @Title checkPerm
     * @author 吕凯
     * @date 2020年9月16日 下午5:02:57
     * @param request
     * @param userPermUrls
     * @param childPermModle
     * @return boolean
     */
    public static boolean checkPerm(HttpServletRequest request, SysMenuModel permModle) {
        return CHECKER.checkPerm(request, permModle);
    }

    /**
     * 检查ele元素是否存在某权限
     * 
     * @Title checkElePerm
     * @author 吕凯
     * @date 2019年9月21日 上午8:58:33
     * @param request
     * @param userPermIds
     * @param childEle
     * @param pageId
     *            pageId属性值，对应权限表中的pageId，唯一
     * @param dataUrl
     *            链接地址，可能不唯一
     * @return boolean
     */
    public static boolean checkElePerm(HttpServletRequest request, Element childEle, String pageId, String dataUrl) {
        return CHECKER.checkElePerm(request, childEle, pageId, dataUrl);
    }

}
